/*
*   配置信息管理模块
*/
#ifndef __BUC_CONFIG__
#define __BUC_CONFIG__

#define _CONFIG_NAME_ "./cloud.conf"

#include "util.hpp"
#include <iostream>
#include <mutex>
#include <memory>

namespace cloud
{
    //单例配置类-Json格式化存储配置信息
    class Config {
        private:
            static std::mutex _mutex; //互斥锁 防止多线程访问
            static Config* _instance; //单例配置类对象指针
            void ReadConfFile()       //读取配置文件
            {
                cloud::FileUtil conf(_CONFIG_NAME_);
                std::string confstr;
                if(conf.GetContent(&confstr) == false)
                {
                    std::cout<<"ReadConfFile(): FileUtil::GetContent error!"<<std::endl;
                    return;
                }
                Json::Value root;
                if(cloud::JsonUtil::UnSerialize(confstr,&root) == false)
                {
                    std::cout<<"ReadConfFile(): unserialize error!"<<std::endl;
                    return;
                }
                
                _hot_time = root["hot_time"].asUInt();
                _server_port = root["server_port"].asUInt();
                _server_ip = root["server_ip"].asString();
                _download_prefix = root["download_prefix"].asString();
                _packfile_suffix = root["packfile_suffix"].asString();
                _back_dir = root["back_dir"].asString();
                _pack_dir = root["pack_dir"].asString();
                _backup_file = root["backup_file"].asString();
            }
            Config() { ReadConfFile(); };
        private:
            size_t _hot_time;             // 热点访问判断时间
            size_t _server_port;          // 服务器端口
            std::string _server_ip;       // 服务器ip
            std::string _download_prefix; // 下载请求的url前缀路径
            std::string _packfile_suffix; // 压缩文件后缀名
            std::string _back_dir;        // 备份文件目录名
            std::string _pack_dir;        // 非热点压缩文件目录名
            std::string _backup_file;     // 备份文件数据信息存放文件名
        public:
            using ptr = std::shared_ptr<Config>;
            size_t GetHotTime()             { return _hot_time; }             // 获取当前热点时间
            size_t GetServerPort()          { return _server_port; }          // 获取当前服务器端口
            std::string GetServerIP()       { return _server_ip; }            // 获取当前服务器IP
            std::string GetDownloadPrefix() { return _download_prefix; }      // 获取下载url前缀路径
            std::string GetPackfileSuffix() { return _packfile_suffix; }      // 获取备份文件后缀名
            std::string GetBackDir()        { return _back_dir; }             // 获取备份文件目录名
            std::string GetPackDir()        { return _pack_dir; }             // 获取非热点压缩文件目录名
            std::string GetBackUpFile()     { return _backup_file; }          // 获取文件备份信息存放文件名

            static Config* GetInstance()   //获取单例配置类对象
            {
                if(_instance == nullptr)
                {
                    _mutex.lock();
                    if(_instance == nullptr)  _instance = new Config;
                    _mutex.unlock();
                }
                return _instance;
            }
    };
    std::mutex Config::_mutex;
    Config* Config::_instance = nullptr;

}



#endif